﻿using System;
using System.Collections.Generic;
using System.Text;
using Sinacor.Servico.Infra.Licensing.BusinessEntity;
using Sinacor.Infra.Core.Licensing;
using PSE.Framework.Configuration;
using Sinacor.Infra.Common.Exceptions;

namespace Sinacor.Servico.Infra.Licensing.ResourceAccess
{
    public class LicenseRA
    {
        public LicenseBE GetLicensing()
        {
            string licensingFile;

            // BusinessEntity de Retorno
            LicenseBE licensingData = null;

            //Objeto onde a licença assinada e encriptada será carregada
            Sinacor.Infra.Core.Licensing.SignedLicensing signedLicensing = null;

            //Objeto que realiza a validação da licença
            Sinacor.Infra.Core.Licensing.LicensingValidator licensingValidator = null;
            
            //Inicializa objeto onde a licença assinada e encriptada será carregada
            signedLicensing = new Sinacor.Infra.Core.Licensing.SignedLicensing();

            //Inicializa objeto é feita a validação da licença
            licensingValidator = new Sinacor.Infra.Core.Licensing.LicensingValidator();
            
            // Inicializa business entity de retorno
            licensingData = new LicenseBE();

            // Obtem o path e o nome do arquivo de onde deve ser carregado o arquivo de licença
            licensingFile = GetLicensingFile();

            try
            {
                // Carrega o arquivo de licença a partir do arquivo especificado;
                signedLicensing.LoadMappedLicensingFile(licensingFile);

                // Atribui ao validator a licença assinada.
                licensingValidator.SignedLicensing = signedLicensing;

                // Atribui ao validator a licença assinada.
                licensingData.BinaryLicense = signedLicensing.GetMappedLicensingByteArray();
            }
            catch (LicensingExpiredException leex)
            {
                // TODO: Colocar Log
                throw new BusinessException(503);
            }
            catch (LicensingCorruptedException lcex)
            {
                // TODO: Colocar Log
                throw new BusinessException(504);
            }

            // Retorna os dados de licença.
            return licensingData;
        }

        /// <summary>
        /// Retorna o caminho do arquivo de licenciamento
        /// </summary>
        /// <returns></returns>
        private string GetLicensingFile()
        {
            return System.IO.Path.Combine(ApplicationConfiguration.GetApplicationRootDirectory(), 
                System.Configuration.ConfigurationManager.AppSettings["LicensingFilePath"]);
        }
    }
}
